package org.ccay.core.util;

import org.ccay.core.util.exception.NoDataEffectedException;
import org.ccay.core.util.exception.NoDataFoundException;
import org.ccay.core.util.exception.SomeDataMissedException;



/**
 * DAO 辅助类，主要用于对DAO返回的结果进行各种断言，将各种异常情况以ApplicationException抛出，以便于用户接收到友好信息。
 * 
 * @since 2011-10-10
 */
public final class DaoUtil {
	private DaoUtil(){		
	}
  

	/** 
	 * 断言所影响的行数不为0
	 * @param row 行数
	 * @param dataType 数据类别
	 * @param dataId 数据标识
	 * @throws NoDataEffectedException 断言失败时抛出的异常
	 */
	public static void assertEffected(int row,String dataType,String dataId) throws NoDataEffectedException{
		if(row <=0){
			throw new NoDataEffectedException(dataType,dataId);
		}
	}
	
	/**
	 * 判断期望更新行数与实际更新行数的一致性
	 * @param resultRow
	 * @param expectedRow
	 * @param dataType
	 * @throws SomeDataMissedException
	 */
	public static void assertEffected(int resultRow,int expectedRow,String dataType) throws SomeDataMissedException{
		if(resultRow < expectedRow){
			throw new SomeDataMissedException(dataType,expectedRow-resultRow);
		}
	}
	
	/** 
	 * 断言所影响的行数不为0
	 * @param row 行数
	 * @param dataType 数据类别
	 * @throws NoDataEffectedException 断言失败时抛出的异常
	 */
	public static int assertEffected(int row,String dataType) throws NoDataEffectedException{
		if(row <=0){
			throw new NoDataEffectedException(dataType);
		}
		return row;
	} 
	
 
	/**
	 * 断言数据是存在的，此方法用于对DAO返回的单个对象进行非空判断，以确定数据库中存在此对象。
	 * @param data 被断言的对象
	 * @param dataType 数据类别
	 * @param dataId 数据标识
	 * @return  被断言的对象
	 * @throws NoDataFoundException 被断言的对象为null时抛出异常
	 */
	public static <T> T assertExists(T data,String dataType,String dataId) throws NoDataFoundException{
		if(data == null){
			throw new NoDataFoundException(dataType,dataId);
		}
		
		return data;
	}
	
	/**
	 * 断言数据是存在的，此方法用于对DAO返回的单个对象进行非空判断，以确定数据库中存在此对象。
	 * @param data 被断言的对象
	 * @param dataType 数据类别
	 * @return  被断言的对象
	 * @throws NoDataFoundException 被断言的对象为null时抛出异常
	 */
	public static <T> T assertExists(T data,String dataType) throws NoDataFoundException{
		if(data == null){
			throw new NoDataFoundException(dataType);
		}
		
		return data;
	}
 
}
